package ztimer

import (
	"fmt"
	"reflect"
	"zinx/zlog"
)

/*
   定义一个延迟调用函数
	延迟调用函数就是 时间定时器超时的时候，触发的事先注册好的
	回调函数
*/

type DelayFunc struct {
	f    func(...interface{} /*可变参数*/)
	args []interface{}
}

func NewDelayFunc(f func(v ...interface{}), args []interface{}) *DelayFunc {
	return &DelayFunc{
		f:    f,
		args: args,
	}
}

// 打印当前延迟函数信息，用于日志记录
func (df *DelayFunc) String() string {
	// 反射打印函数名
	ss := fmt.Sprintf("{DelayFunc:%s, args:%v}", reflect.TypeOf(df.f).String(), df.args)
	zlog.Debug(ss)
	return ss
}

// 执行延迟函数，若执行失败，抛出异常
func (df *DelayFunc) Call() {
	defer func() {
		if err := recover(); err != nil {
			zlog.Error(df.String(), "Call err: ", err)
		}
	}()

	df.f(df.args...)
}
